package com.jianzh5.util;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.FileUploadException;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

/**
 * 附件上传工具类 ，使用了Spring Mvc的上传封装类
 * 
 * @author Jason Email bsj33123@sina.com
 */
public class FileUploadUtils {
	private static String defaultFileType="jpg,jpeg,png,gif";
	/**
	 * @param request
	 *            HttpServletRequest
	 * @param multipartFile
	 *            MultipartFile
	 * @param basePathDir
	 *            存储附件的目录，可为空，在附件根目录之下，必须以"/"开始，无需"/"结束
	 * @param fileName
	 *            附件存储的文件名称
	 * @param fileType
	 *            支持的文件扩展名(多个用英文逗号隔开)
	 * @return
	 * @throws IllegalStateException
	 * @throws java.io.IOException
	 * @throws FileUploadException
	 */
	public static String saveFile(HttpServletRequest request,
			MultipartFile multipartFile, String basePathDir, String fileName,
			String...fileType) throws
            FileUploadException {
		if(multipartFile==null){
			return null;
		}
		if(fileType!=null && fileType.length>0){
			defaultFileType="010010";
			for(String type:fileType){
				defaultFileType+=","+type;
			}
		}
		String filePath = InfoCenterHome.FILEPATH + basePathDir;
		String fileRealPathDir = request.getSession().getServletContext().getRealPath("/")+File.separator+filePath;
		File basePath = new File(fileRealPathDir);
		if (!basePath.exists()) {
			basePath.mkdirs();
		}
		String originalFilename = multipartFile.getOriginalFilename();
		if(originalFilename==null || originalFilename.equals("")){
			return "";
		}
		String suffix = originalFilename.substring(originalFilename
				.lastIndexOf(".") + 1);
		if(suffix==null || suffix.equals("")){
			return "";
		}
		if (defaultFileType.indexOf(suffix) < 0) {
			throw new FileUploadException("系统不支持上传'" + suffix + "'类型的文件");
		}
		filePath += "/" + fileName +"."+ suffix;
		try {
			multipartFile.transferTo(new File(fileRealPathDir + File.separator
					+ fileName +"."+ suffix));
/*			System.out.println(fileRealPathDir + File.separator
					+ fileName +"."+ suffix);*/
		} catch (IllegalStateException | IOException e) {
			e.printStackTrace();
		}
		return filePath;
	}

	/**
	 * 
	 * @param request
	 *            HttpServletRequest
	 * @param multipartFile
	 *            MultipartFile
	 * @param basePathDir
	 *            存储附件的目录，可为空，在附件根目录之下，必须以"/"开始，无需"/"结束
	 * @param fileType
	 *            支持的文件扩展名(多个用英文逗号隔开)
	 * @return
	 * @throws FileUploadException 
	 * @throws FileSuffixOutException
	 */
	public static String saveFile(HttpServletRequest request,
			MultipartFile multipartFile, String basePathDir,String...fileType) throws  FileUploadException{
		SimpleDateFormat sDf = new SimpleDateFormat("yyyyMMddHHmmss");
		String fileName = sDf.format(new Date());
		return saveFile(request, multipartFile, basePathDir, fileName,fileType);
	}

	/**
	 * 自动保存表单里面所有的File类型的表单元素，返回附件的相对路径集合
	 * 
	 * @param request
	 *            MultipartHttpServletRequest
	 * @param basePathDir
	 *            存储附件的目录，可为空，在附件根目录之下，必须以"/"开始，无需"/"结束
	 * @param fileName
	 *            附件存储的文件名称
	 * @param fileType
	 *            支持的文件扩展名(多个用英文逗号隔开)
	 * @return
	 * @throws FileUploadException 
	 */
	public static String[] saveFile(MultipartHttpServletRequest request,
			String basePathDir, String fileName,String...fileType) throws  FileUploadException{
		String filePaths = "";
		Iterator<String> fileNames = request.getFileNames();
		int no = 1;
		while (fileNames.hasNext()) {
			MultipartFile file=request.getFile(fileNames.next());
			String saveFileName=saveFile(request,file,basePathDir, fileName + "-" + no,fileType);
			if(saveFileName!=null && !saveFileName.equals("")){
				filePaths += ";"+saveFileName; 	
			}
			no++;
		}
		if(filePaths.length()>1){
			return filePaths.substring(1).split(";");
		}
		return null;
	}

	/***
	 * 自动保存表单里面所有的File类型的表单元素，返回附件的相对路径集合
	 * 
	 * @param request
	 *            MultipartHttpServletRequest
	 * @param basePathDir
	 *            存储附件的目录，可为空，在附件根目录之下，必须以"/"开始，无需"/"结束
	 * @param fileType
	 *            支持的文件扩展名(多个用英文逗号隔开)
	 * @return
	 * @throws FileUploadException 
	 */
	public static String[] saveFile(MultipartHttpServletRequest request,
			String basePathDir,String...fileType) throws  FileUploadException{
		SimpleDateFormat sDf = new SimpleDateFormat("yyyyMMddHHmmss");
		String fileName = sDf.format(new Date());
		return saveFile(request, basePathDir, fileName,fileType);
	}
}
